package com.itcast.rabbitmq.ps;

import com.itcast.rabbitmq.util.ConnectionUtil;
import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * 发布与订阅模式消费者:接受消息
 */
public class Consumer2 {
    public static void main(String[] args) throws Exception{
        //创建连接
        Connection connection = ConnectionUtil.getConnection();
        //创建频道
        Channel channel = connection.createChannel();
        //声明交换机；参数1：交换机名称，参数2：交换机类型（fanout,direct,topic）
        channel.exchangeDeclare(Producer.FANOUT_EXCHANGE, BuiltinExchangeType.FANOUT);
        //声明队列
        /**
         * 参数1：队列名称
         * 参数2：是否定义持久化队列（消息会持久化保存在服务器上）
         * 参数3：是否独占本连接
         * 参数4：是否在不使用的时候队列自动删除
         * 参数5：其它参数
         */
        channel.queueDeclare(Producer.FANOUT_QUEUE_2,true,false,false,null);

        //队列绑定到交换机,参数1：队列名称，参数2：交换机名称，参数3：路由key
        channel.queueBind(Producer.FANOUT_QUEUE_2,Producer.FANOUT_EXCHANGE,"");

        //每次可以预取多少个消息
        //channel.basicQos(1);

        //创建消费者（接收消息并处理消息）；
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
            /**
             *
             * @param consumerTag
             * @param envelope 封装的包
             * @param properties 额外的属性
             * @param body 消息
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                //路由id
                System.out.println("路由id:" + envelope.getRoutingKey());
                //交换机
                System.out.println("交换机:" + envelope.getExchange());
                //消息id
                System.out.println("消息id:" + envelope.getDeliveryTag());
                //接收到的消息
                System.out.println("接收到的消息:" + new String(body,"utf-8"));
                //确认消息
                /**
                 * 参数1：消息id
                 * 参数2：false表示只有当前这条被处理
                 */
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };
        //监听队列
        /**
         * 参数1：队列名
         * 参数2：是否要自动确认；设置为true表示消息接收到自动向MQ回复接收到了，MQ则会将消息从队列中删除；
         * 如果设置为false则需要手动确认
         * 参数3：消费者
         */
        channel.basicConsume(Producer.FANOUT_QUEUE_2,true,defaultConsumer);
    }
}
